草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 检查模板类的某些特化是否是特定类的基类的特征

现代STL中有std::is_base_of。它允许我们确定第二个参数是否派生自第一个参数,或者它们是否是相同的类,否则,确定它们之间是否没有这种关系。是否可以在不区分其特化涉及哪些具体实际参数的情况下确定一个类是否派生自某个具体模板类?说,我们有;templatestructB{};和templatestructD:B{};是否可以定义类型特征:templateis_derived_from_B;当T是D的任何特化并从std::派生时,它从std::true_type派生:false_type如果T不是从B的任何特化派生的? 最佳答案

c++ - 为什么不允许在非推导上下文中使用基类定义,以及如何解决这个问题?

我有以下代码:#includetemplatestructBase{usingType=int;};templatestructDerived:Base{//uncommmentingthebelowcausecompilererror//usingAlias=Type;};intmain(){Derived::Typeb=1;std::cout现在类型名Type可用于Derived如果它在推导的上下文中-如b的完全有效声明所示.但是,如果我尝试引用Type在Derived的声明中本身,然后我得到一个编译器错误,告诉我Type不命名类型(例如,如果Alias的定义未注释)。我想这与编译

c++ - 将派生类分配给基类

执行以下操作是否安全或者是否是未定义的行为:classBase{private:inta;};classDerived:publicBase{private:intb;};Basex;Derivedy;x=y;//safe?派生类中的额外位是否被切掉了? 最佳答案 是的,切片发生了。不过,这不是未定义的行为。您可能会发现C++-FAQ中的此条目很有帮助:http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8

c++ - 从 void* 到基类指针的转换

我有一些层次结构:基类、派生类和一些将用户数据存储为void*的结构。该void可以存储Base和Derived类指针。主要问题是我不知道那里存储的是基指针还是派生指针。classBase{public:inttype;};classDerived:publicBase{};Base*base;//initbasepointerDerived*derived;//initderivedpointervoid*base_v=base;void*derived_v=derived;//voidpointersarecorrect.Theypointtobaseandderivedvaria

c++ - 从派生类初始化列表调用基类构造函数的顺序

structB{intb1,b2;B(int,int);};structD:B{intd1,d2;//whichistechnicallybetter?D(inti,intj,intk,intl):B(i,j),d1(k),d2(l){}//1stBase//orD(inti,intj,intk,intl):d1(k),d2(l),B(i,j){}//lastBase};以上只是伪代码。实际上,我想知道调用基础构造函数的顺序重要吗?是否有任何情况导致的不良行为(尤其是极端情况)?我的问题是关于更多技术方面的问题,不是编码风格。 最佳答案

c++ - 隐式调用不可访问的虚拟基类的构造函数

考虑下面的代码。g++和clang++都(正确地)提示构造函数A(int)在类D中是私有(private)的。请注意,由于A是D的虚拟基类,因此A必须在mem-initializer类D的派生类,根据C++11中的§12.6.2/7。参见liveexample.classA{public:A(inti):x(i){}A():x(1){}intx;};classB:privatevirtualA{protected:B(inti):A(i){}};classC:publicB,privatevirtualA{protected:C(inti):A(i),B(i){}};classD:pu

c++ - "upcast"方法指针并将其与基类指针一起使用是否安全?

假设我有一个可以保存基类方法地址的指针类型。我可以将子类方法的地址分配给它并期望它正常工作吗?在我的例子中,我将它与基类指针一起使用,对象的动态类型是派生类。structB{typedefvoid(B::*MethodPtr)();};structD:publicB{voidfoo(){cout(&D::foo);(pb->*mp)();}标准在谈论static_cast时是这样说的:5.2.9.9Anrvalueoftype“pointertomemberofDoftypecv1T”canbeconvertedtoanrvalueoftype“pointertomemberofBof

c++ - C++中的单例和抽象基类

最近我收到有关实现单例但涉及抽象基类的问题。假设我们有这样的类层次结构:classIFoo{...};//it'sABCclassFoo:publicIFoo{...};我们有如下定义的单例类:templateclassSingleton{public:staticT*Instance(){if(m_instance==NULL){m_instance=newT();}returnm_instance;}private:staticT*m_instance;};所以如果我想像下面这样使用:IFoo::Instance()->foo();我该怎么办?如果我这样做:classIFoo:pu

使用派生类之外的派生类对象调用基类方法

我看到了许多描述如何调用基类函数的帖子在派生的类函数中使用Super关键字调用。我想使用派生的类对象在全球范围内调用Base类重载函数。classa:def__init__(self):self.x=45deffun(self):print"funinbaseclass"classb(a):def__init__(self):self.y=98deffun(self):print"funinderivedclass"objb=b()objb.fun()#hereiwanttocallthebaseclassfun()看答案输入:objb=b()super(b,objb).fun()输出:fun

java - Morphia 中的查询基类不起作用

我正在使用MongoJava驱动程序3.0.0-beta2和吗啡0.110。我有以下类(class):@EntitypublicabstractclassAnimal{protectedObjectIDid;}@EntitypublicclassCatextendsAnimal{publicStringname;}两者都在初始化时注册了吗啡。我有一个存储为Cat对象的Animal的ID。此查询返回空值:datastore.get(Animal.class,id);虽然此查询为我提供了正确的对象:datastore.get(Cat.class,id);是我做错了还是一个错误?我尝试做的事